package list;

/**
 * @since   13/08/1992
 * @author Ben
 * @param <E> Tipo de objetos que utiliza esta clase
 * Basado en código de Java Structures de Duan y Baily
 */

public class ListaSimple<E> extends AbstractList<E>
{

   protected int count; // list size
   protected Nodo<E> head; // ref. to first element

   public ListaSimple()
   // post: generates an empty list
   {
      head = null;
      count = 0;
   }
   
    @Override
   public int size()
   // pre: No hay.
   // post: returns number of elements in list
  {
    return count;
  }
  
    @Override
  public void addFirst(E value)
  // pre: No hay.
  // post: value is added to beginning of list
  {
     // note order that things happen:
     // head is parameter, then assigned
     head = new Nodo<>(value, head);
     count++;
  }


    @Override
    // pre: La lista no está vacía.
    // post: Se devuelve el primer elemento de la lista.
    public E getFirst() {
        return head.value();
    }


    @Override
    // pre: La lista no está vacía.
    // post: Se devuelve el primer elemento de la lista y se retira de esta.
    public E removeFirst() {
        Nodo<E> temp = head;
        if(head.next()==null)
            head=null;
        else
            head = head.next();
        count--;
        return temp.value();
    }
}
